package algorithm;

/**
 * @author apple
 * @Classname  HammingWeight 汉明重量
 * @Description 计算一个数的二进制数中有多少个1
 * @Date 2020/3/3 16:53
 */
public class HammingWeight {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            /**System.out.println(hammingWeightCount(i));**/
            System.out.println(hammingWeightCountByForce(i));
            /**System.out.println(i+"="+isOdd(i));**/
            System.out.println("--");
        }
    }

    /**
     * hamming weight  一个数的二进制数中有多少个1
     **/
    public static int hammingWeightCount(int n) {
        int count = 0;
        while (n != 0) {
            count++;
            n = n & (n - 1);
        }
        return count;
    }

    /**
     * 暴力解法
     **/
    public static int hammingWeightCountByForce(int n) {
        int count = 0;
        /**当n不等于0时，循环有效。
         * 当n和1的与位操作不等于0，即n为奇数，二进制数的末位是1，count加一，然后n右移一位，即除以2；
         * 当n和1的与位操作等于0，即n为偶数，二进制数的末位是0，count不加一，然后n右移一位，即除以2；
         * 直到n=0，循环结束。**/
        while (n != 0) {
            if ((n & 1) != 0) {
                count++;
            }
            n = n >> 1;
        }
        return count;
    }

    /**
     * 判断是否为偶数
     */
    public static boolean isOdd(int n) {
        if ((n & 1) == 0) {
            return true;
        }
        return false;
    }

}
